package com.example.demo.controller;

import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.validation.Valid;
import java.util.Optional;

/**
 * 用户控制器
 * 处理用户注册和查询请求
 */
@Controller
@RequestMapping("/users")
public class UserController {

    private final UserService userService;

    /**
     * 构造函数注入UserService
     * @param userService 用户服务
     */
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    /**
     * 显示注册页面
     * @param model 模型
     * @return 注册页面视图
     */
    @GetMapping("/register")
    public String showRegisterForm(Model model) {
        if (!model.containsAttribute("user")) {
            model.addAttribute("user", new User());
        }
        return "register";
    }

    /**
     * 处理用户注册请求
     * @param user 用户信息
     * @param bindingResult 绑定结果，包含验证错误
     * @param redirectAttributes 重定向属性
     * @return 成功则重定向到用户列表，失败则返回注册表单
     */
    @PostMapping("/register")
    public String registerUser(@Valid @ModelAttribute("user") User user,
                              BindingResult bindingResult,
                              RedirectAttributes redirectAttributes) {
        // 检查表单验证错误
        if (bindingResult.hasErrors()) {
            redirectAttributes.addFlashAttribute("org.springframework.validation.BindingResult.user", bindingResult);
            redirectAttributes.addFlashAttribute("user", user);
            return "redirect:/users/register";
        }

        // 检查邮箱是否已存在
        try {
            userService.registerUser(user);
            redirectAttributes.addFlashAttribute("successMessage", "注册成功!");
            return "redirect:/users/list";
        } catch (IllegalArgumentException e) {
            bindingResult.rejectValue("email", "error.user", e.getMessage());
            redirectAttributes.addFlashAttribute("org.springframework.validation.BindingResult.user", bindingResult);
            redirectAttributes.addFlashAttribute("user", user);
            return "redirect:/users/register";
        }
    }

    /**
     * 显示用户列表
     * @param model 模型
     * @return 用户列表页面视图
     */
    @GetMapping("/list")
    public String listUsers(Model model) {
        model.addAttribute("users", userService.getAllUsers());
        return "userList";
    }

    /**
     * 显示用户详情
     * @param id 用户ID
     * @param model 模型
     * @return 用户详情页面视图，如果用户不存在则重定向到用户列表
     */
    @GetMapping("/{id}")
    public String showUserDetails(@PathVariable Long id, Model model, RedirectAttributes redirectAttributes) {
        Optional<User> user = userService.getUserById(id);
        if (user.isPresent()) {
            model.addAttribute("user", user.get());
            return "userDetails";
        } else {
            redirectAttributes.addFlashAttribute("errorMessage", "用户不存在!");
            return "redirect:/users/list";
        }
    }

    /**
     * 删除用户
     * @param id 用户ID
     * @param redirectAttributes 重定向属性
     * @return 重定向到用户列表
     */
    @GetMapping("/delete/{id}")
    public String deleteUser(@PathVariable Long id, RedirectAttributes redirectAttributes) {
        try {
            userService.deleteUser(id);
            redirectAttributes.addFlashAttribute("successMessage", "用户已成功删除!");
        } catch (Exception e) {
            redirectAttributes.addFlashAttribute("errorMessage", "删除用户失败: " + e.getMessage());
        }
        return "redirect:/users/list";
    }

    /**
     * 主页重定向
     * @return 重定向到注册页面
     */
    @GetMapping("/")
    public String home() {
        return "redirect:/users/register";
    }
} 